package cn.tedu.ivoscm.base.file;

import cn.tedu.ivoscm.base.exception.ServiceException;
import cn.tedu.ivoscm.base.response.JsonResult;
import cn.tedu.ivoscm.base.response.StatusCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@Slf4j
@RestController
@RequestMapping("/v1/file")
public class UploadController {
    @PostMapping("upload")
    // 形参名与前端控件名（name属性）一致
    public JsonResult upload(MultipartFile file) {
        log.debug("开始处理图片上传请求");
        // 1. 获取文件名
        String fileName = file.getOriginalFilename();
        // 2. 获取文件后缀
        String suffix = fileName.substring(fileName.lastIndexOf("."));
        // 3. 通过UUID类生成唯一的新文件名
        fileName = UUID.randomUUID() + suffix;
        // 4. 指定服务器上物理存在的路径存储上传的图片
        String path = "D:/files";
        // 5. 优化：为提高检索性能，设置日期路径作为图片检索的文件夹
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
        // 6. 将当前实际日期转为上面的格式
        String datePath = sdf.format(new Date());
        // 7. 路径封装+创建文件类对象
        path += "/" + datePath;
        File dirFile = new File(path);
        // 8. 判断文件夹是否存在，不存在则创建文件夹
        if (!dirFile.exists()) {
            dirFile.mkdirs();
        }
        // 9. 拼接完整的图片路径
        String filePath = path + fileName;
        // 10. 根据上面的路径，将形参接收到的图片文件存入上方创建好的日期文件夹中
        try {
            file.transferTo(new File(filePath));
        } catch (IOException e) {
            e.printStackTrace();
            return new JsonResult(StatusCode.OPERATION_FAILED, "图片上传失败！");
        }
        // 11. 将日期路径与文件名返回给前端
        String url = datePath + fileName;
        String msg = "图片上传成功，路径：" + url;
        log.debug(msg);
        return JsonResult.ok(url);
    }

    @DeleteMapping("delete")
    public JsonResult delete(String imgUrl) {
        log.debug("开始处理图片删除请求");
        // 1. 组合路径
        String dirPath = "D:/files/";
        String filePath = dirPath + imgUrl;
        log.debug("删除的文件路径：{}", filePath);
        // 2. 删除文件
        File file = new File(filePath);
        if (file.exists()) {
            file.delete();
            log.debug("图片删除成功！");
            return JsonResult.ok();
        } else {
            log.debug("图片删除失败！");
            throw new ServiceException(StatusCode.OPERATION_FAILED);
        }
    }
}
